home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-Sensation: Golden Games / Amiga CD-Sensation - Ausgabe 2 - Golden Games (1996)(GTI - Schatztruhe)(DE)[!].iso / Specials / Inform / library / changes.txt next >
Text File  |  1995-08-01  |  37KB  |  701 lines

  1.  
  2. Life and Times of the Inform Library                        3rd July 1995
  3. ====================================
  4.  
  5. This modification history takes release 5/5 of the Inform library as a base,
  6. and runs up to release 5/11.  5/5 is the state described in the first
  7. edition of the Designer's Manual and 5/11 the one in the (forthcoming)
  8. revised edition; thus, everything in this file will soon be integrated into
  9. the current documentation.
  10.  
  11. Thanks to Gareth Rees, Mike Threepoint, Torbj|rn Anderson, Brendon Wyber,
  12. Robert Dickau, Brad Jones, David Wagner, Robert Stone, Matthew Russotto
  13. and many, many others.
  14.  
  15. Changes in Release 5/6 (941112)
  16. ===============================
  17.  
  18. 1. The game banner is tidier and a line shorter (some people felt the old one
  19.    overdone: use the command "version" for more code numbers)
  20. 2. EnglishNumber printing fixed up to work nicely across the whole range of
  21.    signed integers (i.e. about plus-minus 30000), with "forty" correctly spelt
  22.    this time: e.g. "minus twelve thousand, three hundred and eight"
  23. 3. The bug "the game crashes if you try to take what you're sitting on or in"
  24.    is fixed
  25. 4. Two new bits are available for WriteListFrom styles.  ISARE_BIT prints
  26.    " is " or " are " before the list, according to its size, and CONCEAL_BIT
  27.    (which only works if WORKFLAG_BIT isn't used) misses off items which have
  28.    "concealed" or "scenery"
  29. 5. Containers now aren't called "open" or "closed" in lists unless actually
  30.    "openable": thus, messages like "a paper cup (which is open but empty)"
  31.    will now read "a paper cup (empty)"
  32. 6. Concealed or scenery items now not mentioned inside vehicles or on top of
  33.    things (see (4)!)
  34. 7. The "found_in" property is enhanced.  If an object O1 is given in the
  35.    found_in list of O2 which isn't a room, then O2 is counted as being in the
  36.    same room as O1, wherever that is at the moment.  (But be warned: this is
  37.    only updated when the player changes rooms.)
  38.    Moreover, the "found_in" property of O can instead of a list of places be
  39.    a routine.  This returns true if O should be in location, false otherwise.
  40.    For instance,
  41.  
  42.      Object Sun "Sun",
  43.        with ....
  44.             found_in
  45.             [; if (location has light) rtrue;
  46.             ],
  47.        has  scenery;
  48.  
  49.    This saves bother with long lists of places, and also makes it much easier
  50.    for objects to spread out or contract (like fire, or flooding) in play.
  51. 8. A bug making YesOrNo() corrupt a customised status line has been removed
  52. 9. Under earlier library files, returning 0 from a token-parsing routine
  53.    was illegal and might hang the parser (see p. 41 in the Designer's Manual
  54.    for the old specification).  Returning 0 is hereby legalised and indicates
  55.    "accept the text the word marker has been skipped over, and count it as
  56.    not specifying any particular object or number".  For example, given
  57.  
  58.      [ PolyAdj w;
  59.        w=NextWord(); if (w=='on' or 'at' or 'in') return 0;
  60.        return -1;
  61.      ];
  62.  
  63.    the token PolyAdj will accept "on", "at" or "in" as alternative choices of
  64.    adjective (and forget which one the player actually typed).
  65.    Similarly,
  66.  
  67.      [ Anything w; 
  68.        while (w~=-1) w=NextWord(); return 0;
  69.      ];
  70.  
  71.    makes the token Anything accepts the entire rest of the line.
  72. 10. The grammar "shut off", "climb up", "close up", "dig", "dig with" has been
  73.     added
  74. 11. Taste and Touch are now required to take objects: as a result the
  75.     old TouchThing action has gone, and there is simply a Touch action.
  76.     (Strictly speaking this is an incompatible change but hardly anyone has
  77.     used these actions anyway.)
  78. 12. The Escape key now acts as Q to get out of menu displays (if your
  79.     interpreter is well enough written to recognise an escape key)
  80. 13. A convenience (but also problem) is that the Receive fake action is
  81.     generated both when the player tries to put an object in something, or
  82.     on it.  This is no problem unless the recipient is trying to be both at
  83.     once, in which case it may need to know why the Receive has been
  84.     generated - i.e., which the player's trying to do.  The "right" solution
  85.     would be to have two different fake actions, but that would be a rather
  86.     incompatible change and make a certain amount of existing code work
  87.     differently.  Instead, a variable called "receive_action" is set to either
  88.     ##PutOn or ##Insert depending on which is causing the Receive to happen.
  89. 14. Several people have asked for easier ways to have several kinds of
  90.     containment at once, all on the same object - on top, inside, under,
  91.     behind, component parts of, etc.  For these (and other) purposes a brand
  92.     new property called "add_to_scope" has been added.  Anything listed under
  93.     this property is also in scope when the parent object is.  (This also has
  94.     consequences for light considerations.)
  95.     See the modest example "A Nasal Twinge" for two applications of this.
  96.     Note for true scope hackers: this scope addition does _not_ occur if the
  97.     object is moved into scope by the programmer explicitly calling
  98.     PlaceInScope (since this must allow completely arbitrary scope
  99.     selections), but that it does happen when objects are moved in scope
  100.     by calls to ScopeWithin(domain).
  101.     The "add_to_scope" property is aliased, so there's no cost in property
  102.     consumption.
  103. 15. Trying to type "undo" on the very first turn now produces a more sensible
  104.     error message.
  105. 16. 5/5 had an especially embarrassing bug - "go north" didn't work!  Which
  106.     goes to show how thoroughly hooked on abbreviations we all are now,
  107.     because hardly anybody noticed.
  108. 17. The initial room description (printed after the game banner) is now
  109.     properly done with a Look action (in particular, before and after
  110.     routines are invoked).  This is in case some horrid "before" hack is
  111.     being applied to the description of the first location.
  112. 18. Likewise, the library now works correctly if the game begins in darkness
  113.     (Steve Meretzky is fond of this trick - e.g. "Hitchhikers", "Sorcerer")
  114. 19. "out" used not to work properly in a dark room with an out map
  115.     connection, but now does
  116. 20. A somewhat brutal test (Torbj|rn Anderson constructed 450 daemons!)
  117.     revealed that the daemon/timer routines stored object numbers in bytes
  118.     rather than words (thus getting them wrong in big games): not any more
  119.     they don't
  120. 21. It is now legal to return 3 from a routine attached to DoMenu (which
  121.     usually prints some text out, such as a hint: return values of 0 or 1
  122.     make the game wait for a space then return to the menu, 2 makes the
  123.     game return directly): this makes the game quit the menu altogether
  124.     as if Q had been pressed (which is useful for juggling submenus around).
  125.  
  126. Changes in Release 5/6 (941117)
  127. ===============================
  128.  
  129. 22. "You open the box, revealing ." bug fixed (when box is empty)
  130. 23. A character got seriously corrupted in the timers routines: fixing this
  131.     was urgent, hence the rapid re-release
  132.  
  133. Changes in Release 5/7 (941214)
  134. ===============================
  135.  
  136. 24. add_to_scope can now take a routine instead of a list of objects.
  137.     This routine has to call AddToScope(obj) for each obj it wants to add
  138.     to the scope. (It may not use ScopeWithin or any other scoping routines)
  139. 25. The direction objects now have the general-purpose "number" property
  140.     provided, as it's sometimes convenient to have a scratch variable for
  141.     each direction (when programming mazes, for instance).
  142. 26. If the constant WITHOUT_DIRECTIONS is defined before inclusion of the
  143.     library files, then 10 of the default direction objects are not defined
  144.     by the library.  The designer is expected to define alternative ones
  145.     (and put them in the "compass" object); otherwise the game will be
  146.     rather static.  (The "in" and "out" directions are still created, because
  147.     they're needed for getting into and out of enterable objects.)
  148. 27. The routine ChangeDefault(property, value) dynamically changes the
  149.     game's default value for that property (i.e. the value that property has
  150.     for any object not explicitly giving a value of its own).  For instance,
  151.  
  152.       ChangeDefault(cant_go, "You're a Master Adventurer now, and still \
  153.                               you walk into walls!");
  154.  
  155. 28. The reverse-order form of "show" didn't work when addressed to a third
  156.     party, as in
  157.  
  158.       charles, show diana the phone bill
  159.  
  160.     but now does.
  161. 29. Very subtle bug in object-name printing (it had a peculiar and very rare
  162.     side-effect which I think only turned up when using odd combinations of
  163.     debugging commands, and took me ages to find!) fixed.
  164. 30. The not very sad demise of another piece of Inform antiquity: the
  165.     use of the "special" token in the library grammar.  The only substantial
  166.     use left was in the grammar for looking up or consulting things, like
  167.     books (an old Curses mainstay).  Now it's tricky to parse lines like
  168.  
  169.       look up figure 18 in the engineering textbook
  170.  
  171.     because almost anything could appear in the first clause, and even its
  172.     format depends on what the second clause is.  So the new arrangement
  173.     is: if an object wants to be "consultable", it should have a before rule
  174.     for the "Consult" action.  The Consult action will happen when the
  175.     player types, for instance,
  176.  
  177.       look up <any words here> in <the object>
  178.       read about <any words here> in <the object>
  179.       consult <the object> about <any words here>
  180.  
  181.     and the object has to parse the <any words here> part itself.
  182.     (Note that "second" doesn't hold any value in a Consult action; internally,
  183.     the <any words here> part is treated as an adjective by the parser.)
  184.     To help the object to do this, variables are set up:
  185.  
  186.       consult_from       -        number of the first word in the <any...>
  187.       consult_words      -        number of words in the <any...>
  188.                                   (which must be at least 1)
  189.  
  190.     It can then use NextWord(), TryNumber(word-number) and the like
  191.     to decide on the topic.  If you really need more elaborate topic-parsing
  192.     then grammar replacement is probably a better bet.
  193. 31. The verbs "read" and "examine" are now separated - this has been a
  194.     popular request for about a year now!  They still both ordinarily
  195.     generate the Examine action, but it is now possible to add or replace
  196.     grammar for "read" without doing so for "examine" at the same time.
  197.     Consequently one may now easily create a separate Read action, if
  198.     required.  E.g.:
  199.  
  200.       Attribute legible;
  201.  
  202.       Object textbook "textbook"
  203.         with name "engineering" "textbook" "text" "book",
  204.              description "What beautiful covers and spine!",
  205.              before
  206.              [; Consult, Read:
  207.                    "The pages are full of nasty equations which \
  208.                     make no sense to you.";
  209.              ],
  210.         has  legible;
  211.       [ ReadSub; <<Examine noun>>; ];
  212.       Extend "read" first
  213.                 * legible                        -> Read;
  214.  
  215.     Note that "read" is automatically translated to "examine" for anything
  216.     which doesn't have "legible", or indeed does but doesn't provide any
  217.     "before" rule for Read.
  218. 32. Many actions (all those which do something substantial and then print a
  219.     message saying they've done it), viz.:
  220.  
  221.       Take, Drop, Insert, PutOn, Remove, Enter, Exit, Go, Unlock, Lock,
  222.       SwitchOn, SwitchOff, Open, Close, Wear, Disrobe, Eat
  223.  
  224.     now consult a variable called "keep_silent".  If this is 1, they say
  225.     nothing in the event of _success_ (if they fail, as they may do in many
  226.     different convoluted ways, they still complain out loud).
  227.     It is essential to reset this variable to 0 after use.
  228.     This feature makes implicit actions much easier to "properly" implement,
  229.     i.e. to implement without bypassing any lurking game rules.
  230. 33. (As indeed here.)  The library used to be a bit casual about putting
  231.     items away automatically into the SACK_OBJECT (if there was one defined),
  232.     but now it applies the full normal rules by causing an Insert action.
  233.     Thus, the sack needs to be open, any odd behaviour coded up for the
  234.     sack will now work, the sack's capacity cannot be exceeded and so on.
  235. 34. The Enter and Exit actions sometimes missed possible location "after"
  236.     rules; they've now been tidied up.
  237. 35. Silly bug in scoring "scored" objects (picked up by take all) fixed.
  238. 36. "your" is now understood in some contexts by the parser: so that
  239.  
  240.       george, give me your ukelele
  241.  
  242.     works (if someone called George is holding a ukelele).
  243. 37. In 5/6 and before, if you put a green box inside a red bag, and then
  244.     tried to put the red bag into the green box, they would collapse in on
  245.     themselves into a black hole and vanish from the game.  (An amusing
  246.     thing to do is then to use the "tree" debugging command on the green
  247.     box.)  The library now insists on the Axiom of Foundation (i.e., won't
  248.     let you put something indirectly inside or on top of itself).
  249.  
  250. Changes in Release 5/7 (941220)
  251. ===============================
  252.  
  253. 38. The "the box of tarot cards is empty already." sentence now capitalises
  254.     the "The".
  255. 39. Bug in the parser fixed.  Occasionally grammar like
  256.  
  257.       ... * scope=MicroScope "at" noun  -> ...
  258.  
  259.     would mistakenly apply the MicroScope scope rules to the second, plain
  260.     noun token.  This no longer happens.
  261. 40. Minor darkness bug (to do with getting out of enterable objects when in
  262.     a dark place) fixed.
  263. 41. Single rather than double new-line now printed when light returns to the
  264.     game (after all, some people have small displays).
  265. 42. If a "supporter" (say, a mantelpiece) holds up only items which have
  266.     "scenery" or "concealed", the library used to say "On the mantelpiece."
  267.     and stop: now it omits such a line entirely.
  268. 43. The treatment of "concealed" possessions of containers is slightly
  269.     tidied up (though using such is not recommended except in scenery, as
  270.     it's likely to need some effort to make inventories do the right thing).
  271. 44. (Cf. (4) above.)  At Gareth Rees' proposal, WriteListFrom now has a
  272.     policy on what to do if both CONCEAL_BIT and WORKFLAG_BIT are set,
  273.     causing a clash.  In this instance, the "workflag" rule applies at the
  274.     top level, but not below, and the "conceal" rule applies below but not
  275.     at the top level.
  276. 45. A soupcon of new grammar: "climb over" (just does the Climb action);
  277.     "thump" and "punch" now equate to "attack"; "present" and "display" to
  278.     "show"; one can now "stand on" something.
  279. 46. It's Christmas, and a new fake action is born.  This one is called
  280.     "ThrownAt" and is analogous to "Receive" for containers: i.e., it runs
  281.     before rules for the object which something is being thrown at.  E.g.,
  282.  
  283.         before
  284.         [;  ThrownAt: if (noun==dart)
  285.                       {   move dart to self; "Triple 20!"; }
  286.                       move noun to location;
  287.                       CDefArt(noun); " bounces incongrously off the board.";
  288.         ],
  289.  
  290.     Note: "after" rules don't apply, as the default behaviour of ThrowAt
  291.     is to do nothing but rebuke the player.
  292.  
  293. Change in Release 5/7 (941230)
  294. ==============================
  295.  
  296. 47. Last and most embarrassing bug fix of 1994: removing a spurious tracing
  297.     message, "Else clause", left in by accident from earlier debugging.
  298.  
  299. Changes in Release 5/7 (950109)
  300. ===============================
  301.  
  302. 48. Minor enhancement to the "tree" debug verb; new "gonear" debug verb,
  303.     such that "gonear frog", say, takes you to the room the frog is in.
  304. 49. The library often needs to print a property value if it's a string, or
  305.     run it if a routine.  There's now a routine to do this:
  306.  
  307.         PrintOrRun(object, property, flag);
  308.  
  309.     If the (optional) flag is given and non-zero, a new-line is printed
  310.     after a string (but only if it was a string).
  311.     The library now makes extensive use of this, tidying up the code
  312.     somewhat, but the reason for the change was that it was previously
  313.     doing signed comparisons to work out where addresses lie in memory,
  314.     which begins to fail when the total game size exceeds about 180K.
  315.     Two new useful primitives are:
  316.  
  317.         UnsignedCompare(x,y)  returns   1  if x>y
  318.                                         0  if x=y
  319.                                        -1  if x<y
  320.  
  321.     and
  322.  
  323.         ZRegion(addr)         returns   1  if addr is a valid object number
  324.                                         2  if addr is a routine address
  325.                                         3  if addr is a string address
  326.                                         0  otherwise.
  327. 50. The "NewRoom" entry point was previously not always being called when
  328.     a new room was entered, as the manual claimed; now it is.
  329. 51. The "purloin" debugging verb now clears "concealed" from anything it
  330.     magically takes - this prevents nuisance in later use.
  331. 52. The "article" property can now hold a routine to print one, in line
  332.     with standard library practise.  One might imagine "a mouse" changing
  333.     dynamically to "some mice", perhaps.
  334. 53. Inelegant messages like "(which is closed) (which is empty)" tidied
  335.     up into "(which is closed and empty)".
  336. 54. New debugging verbs are provided to take advantage of the Z-machine's
  337.     own game-testing features.  These may not fully work under ITF, but
  338.     do work under Zip.  (For either Standard or Advanced games.)
  339.  
  340.     "recording" (or "recording on") saves all the commands typed in a
  341.        session to a file,
  342.     "recording off" stops this,
  343.     "replay" plays back the script (i.e. reads commands from the file);
  344.  
  345.     in order to make the Z-machine predictable (that is, deterministic)
  346.     one would like to make the random number generator do exactly the
  347.     same thing each time, and this is achieved by typing
  348.  
  349.     "random", which internally does @random -100.  It should be noted that
  350.     this in particular depends very much on how good your interpreter
  351.     (and its port) is: on my machine, this doesn't appear to do anything,
  352.     for instance.
  353.  
  354. Changes in Release 5/8 (950118)
  355. ===============================
  356.  
  357. 55. Trying to ask somebody else to repeat something by, e.g.,
  358.  
  359.         major, resign     rather than     major, resign
  360.         major, again                      again
  361.  
  362.     would sometimes (horrifyingly) hang the Z-machine - now it produces a
  363.     polite reply.  Apologies for having missed this case.
  364. 56. And another crude parser bug.  "get all except" hasn't always been
  365.     working recently: now it works again.
  366. 57. A popular request (well, three people asked, anyway) is for a way of
  367.     changing some of the parser's assumptions about what to do with vague
  368.     requests by the player.  The notorious one is: should "take all"
  369.     attempt to take objects marked as "scenery", and thus reveal their
  370.     existence as game objects?  (Infocom games did, and Inform usually
  371.     does.)
  372.     The new entry point
  373.  
  374.         ChooseObjects(object, code)
  375.  
  376.     is provided for this.  It is called in two circumstances.  If code is
  377.     0 or 1, that means the parser is contemplating including this item in
  378.     an "all", and the code is 0 if the parser intends not to, 1 if it
  379.     intends to do so.  Returning 1 forces it to be included, returning 2
  380.     forces it to be excluded and returning 0 (the default, i.e. rfalse)
  381.     makes the parser do what it had previously decided anyway.
  382.  
  383.     The other time is when code is 2.  This means that the parser is having
  384.     to sort through a list of items, trying to decide which is intended.
  385.     Return a number from 0 to 9 (0 is the default, i.e. rfalse again) to
  386.     give the item a score for how appropriate is.
  387.     For instance:
  388.  
  389.         [ ChooseObjects obj code;
  390.           if (code<2) { if (obj has scenery) return 2; rfalse; }
  391.           if (action_to_be==##Eat && obj has edible) return 3;
  392.           if (obj hasnt scenery) return 2;
  393.           return 1;
  394.         ];
  395.  
  396.     (The parser's internal variable "action_to_be" is always set to the
  397.     action that will be generated if the current line of grammar is
  398.     successfully matched.)
  399.     Scenery is penalised twice in this example - it never appears in any
  400.     multiple lists, and non-scenery is always preferred over scenery when
  401.     sorting out an ambiguous input.  Unless, that is, the object is edible,
  402.     and the player is trying to Eat something.  ("eat black" will now choose
  403.     a Black Forest Gateau rather than a black rod with a star on the end).
  404. 58. Another popular request (popular with everyone except me, as it was
  405.     horrid to implement) was for a mechanism for changing the Library's
  406.     habitual messages - many people become very irritated when their own
  407.     games say "Violence isn't the answer, you know" for the dozenth time.
  408.     Of course this was always possible by massive means (replacing huge
  409.     numbers of routines, for instance), but now it's much easier.
  410.  
  411.     This feature is provided in an unusual way.  You may optionally
  412.     provide a special object called LibraryMessages (but if you do so,
  413.     you must define it in between the inclusion of "Parser" and the
  414.     inclusion of "Verblib").  Here is an example, changing two of the
  415.     library's standard messages:
  416.  
  417.         Object LibraryMessages "lm"
  418.           with before
  419.                [;  Jump: "You jump and float uselessly for a while in \
  420.                           the zero gravity here on Space Station Alpha.";
  421.                    SwitchOn:
  422.                        if (lm_n==3)
  423.                        {  print "You power up "; DefArt(lm_o); "."; }
  424.                ];
  425.  
  426.     The object never appears in the game, of course, and exists solely
  427.     to have a "before" routine.  As usual, returning false (0) causes the
  428.     library to carry on as it normally would, while returning true (1)
  429.     indicates that you've printed the message and it doesn't need to.
  430.  
  431.     The Jump action only ever prints one message, but more elaborate
  432.     actions such as SwitchOn have several (the extreme case is Take, with
  433.     13).  lm_n holds the message number, which counts upwards from 1
  434.     essentially in order of use in VerbLib.  It would be too inefficient
  435.     to define 250 constants to give these cute names, and instead the
  436.     programmer is referred to the last few pages of the source code of
  437.     VerbLib.  The stock of messages has changed very little in the last
  438.     six months and, while it may occasionally be added to, there shouldn't
  439.     be any need to renumber the present ones.  An amusing way to observe
  440.     LM in action is to add
  441.  
  442.         Object LibraryMessages "lm"
  443.           with before
  444.                [;  print "[", sw__var, ",", lm_n, "] ";
  445.                ];
  446.  
  447.     to your game (arcane note: sw__var, the "switch variable", always
  448.     holds the action number used by Inform in working out which paragraph
  449.     of code to run in a before/after/life routine).  Another amusing
  450.     effect is to simply write "rtrue" for the before routine, which
  451.     results in an alarmingly silent game - blindfold Adventure, perhaps.
  452.  
  453.     Note that LM can be used as a sneaky way to add extra rules onto the
  454.     back of actions, and to make messages more sensistive to game context.
  455.  
  456.     One could even use LM to translate absolutely everything the Library
  457.     says into Middle English during a medieval section of a game.  This is
  458.     left as an exercise to the reader.
  459.  
  460.     This new feature imposes a slight speed overhead, which should hardly
  461.     be noticed (text printing being something which isn't repeated hundreds
  462.     of times per second) and a slight code size overhead, which might:
  463.     about 2K.  I regret this but consider the gain to outweigh the loss.
  464. 59. "him"/"her" now never become the player when the player self-refers.
  465.     Of course people never refer to themselves in the third person...
  466. 60. There was a slight bug in the method of Asking people about things, and
  467.     anyway the existing documentation is a bit unclear (read: slightly
  468.     wrong).  The way to code for this is:
  469.  
  470.         Ask: if (second=='bug') "Graham says, ~It's mended now.~";
  471.  
  472.     though you can also look at special_word directly.  What you can't do
  473.     is look at noun and expect to find the word there: noun is of course
  474.     set to Graham.
  475. 61. "graham, tell me about bug" is now equivalent to "ask graham about bug".
  476.     Likewise, one can Tell people about things (this is a new action).
  477. 62. One now can't Enter or Exit a closed container.  (Enterable objects
  478.     which aren't containers or doors don't need to be open, though.)
  479. 63. The Curses-style "objects" and "places" verbs have been added.  These
  480.     are normally present in the library but can be made not to appear by
  481.     defining the constant NO_PLACES before the inclusion of VerbLib.
  482.     (A neat trick, if an object or place is going to be misleadingly named
  483.     in such a list (e.g. if it represents 40 different nearly-identical
  484.     rooms) is to give an object a different short_name when the action is
  485.     ##Places or ##Objects than the rest of the time.)
  486.  
  487. Changes in Release 5/8 (950201)
  488. ===============================
  489.  
  490. 64. "You aren't in anything at the moment" bug (if you don't know what this
  491.     means, you haven't seen it) fixed.
  492. 65. In 5/8, after a ChangePlayer the former player's object was not properly
  493.     short-named in some cases: now it's usually called "your former self".
  494. 66. Actions causing death or victory could sometimes make LibraryMessages
  495.     replacement go wrong: this is fixed.
  496. 67. MAX_TIMERS bound checking corrected (at long last).
  497. 68. "places" no longer says "You have visited" twice, and "objects" now says
  498.     "None." if you've never held any objects in the game.
  499. 69. The prompt "^>" is now printed via the library messages system, with the
  500.     (fake) action Prompt.  Thus, you might use:
  501.  
  502.         Object LibraryMessages "lm"
  503.           with before
  504.                [;  Prompt: print "^What now? "; rtrue;
  505.                ];
  506.  
  507.     to change the prompt.  Likewise you can adapt it to events, or get rid
  508.     of the "skipped line on screen each turn" convention.
  509.     This prompt is only used in ordinary game play, and not at such keyboard
  510.     inputs as yes/no questions or the RESTART/RESTORE/QUIT game over choice.
  511. 70. Subtle change in transparency rules.  If you ChangePlayer to some
  512.     creature, then any animate objects which are (directly or indirectly)
  513.     holding the creature at the time are made "transparent".  This prevents
  514.     you from finding yourself in darkness for a reason which is now
  515.     obselete.
  516.  
  517. Changes in Release 5/9 (950217)
  518. ===============================
  519.  
  520. 71. "initial" routines for rooms and NewRoom were being called on every
  521.     Look action, which was wrong behaviour: now they're gone through only
  522.     before a Look action occurs in a different location from the previous
  523.     one in which a Look took place.
  524. 72. Two messages generated by Enter now differ for trying to get onto
  525.     an enterable supporter (as opposed to getting into an enterable
  526.     container).
  527. 73. Yet another foolish bug in "objects" fixed: the spurious "None".
  528. 74. The parser error NUMBER_PE (generated when a "number" token fails to
  529.     match) has been demoted in importance.  Previously it took precedence
  530.     over almost every other error, now the reverse is true: so in grammar
  531.     like
  532.            "take" * noun    -> Take
  533.                   * number  -> TakeNumber;
  534.  
  535.     if nonsense like "lkjhkjh" is typed, then "You can't see any such thing"
  536.     is replied in preference to "I didn't understand that number".  The
  537.     assumption behind the change is that when both errors are possible, the
  538.     former is the "natural" use of the verb, the latter an exceptional one.
  539. 75. In some circumstances "location" briefly had the wrong value when
  540.     running a vehicle's "before" routine for the Go rule to see whether it
  541.     will allow the player to travel in it.  This is now fixed.
  542. 76. Small new feature: returning 2 from a vehicle's "before" in such
  543.     circumstances tells the library to give up and print nothing.
  544. 77. Large presentational feature.  If a collection of game objects - say,
  545.     all the edible items in the game - have a common non-zero value of the
  546.     property "list_together", say 1, they will always appear adjacently in
  547.     inventories, room descriptions and the like.
  548.     If, moreover, instead of being a small number the common value is a
  549.     string such as "foodstuffs" then lists will cite, e.g.
  550.  
  551.            three foodstuffs (a scarlet fish, some lemmas and an onion)
  552.  
  553.     in running text, or
  554.  
  555.            three foodstuffs:
  556.              a scarlet fish
  557.              some lemmas
  558.              an onion
  559.  
  560.     in indented lists.  (This only happens when two or more are together.)
  561.     If, moreover, the common value is a routine, e.g.
  562.  
  563.            [; if (inventory_stage==1) print "heaps of food, notably ";
  564.               else print ", which would do you no good";
  565.            ],
  566.  
  567.     then this will be called twice: once, with "inventory_stage" set to
  568.     1, as a preamble to the list of items, and once (with 2) to print any
  569.     postscript required.  It is allowed to change "c_style" (the current
  570.     list style) without needing to restore the old value and may, by
  571.     returning 1 from stage 1, signal the list-maker not to print a list at
  572.     all.  The simple example above results in
  573.  
  574.            heaps of food, notably a scarlet fish, some lemmas and an onion,
  575.            which would do you no good
  576.  
  577.     Such a routine may want to make use of the variables "parser_one" and
  578.     "parser_two", which respectively hold the first object in the group
  579.     and the depth of recursion in the list (this might be needed to keep
  580.     indentation going properly).  Applying x=NextEntry(x,parser_two);
  581.     moves x on from parser_one to the next item in the group.
  582.     Another helpful variable is "listing_together", set up to the first
  583.     object of a group being listed (or to 0 whenever no group is being listed).
  584.     For further examples, see the little example "List Property", which
  585.     sorted out the following 24 objects into...
  586.  
  587.       You can see a plastic fork, knife and spoon, three hats (a fez, a Panama
  588.       and a sombrero), the letters X, Y, Z, P, Q and R from a Scrabble set, a
  589.       defrosting Black Forest gateau, Punch magazine, a recent issue of the
  590.       Spectator, a die and eight coins (four silver, one bronze and three gold)
  591.       here.
  592. 78. The parser used to overflow occasionally when dealing with a very vague
  593.     request which matches against far too many items; now it checks the size
  594.     of the match list before adding to it.  (In practice, this only happened
  595.     when one tried to, e.g., "purloin all" in a game of more than 64 items.)
  596. 79. The Search (e.g. "look inside") action sometimes produced mysterious
  597.     messages when the only contents of the object in question were all
  598.     "concealed", and similar misfortunes befell some room descriptions.
  599.     Now mended.
  600. 80. A between-routines jump inside the parser has been removed, as it was
  601.     unnecessary and Mark Howell didn't like the idea.
  602. 81. The "wake" grammar is slightly improved, and the WakeOther action (for
  603.     waking someone else up) is now routed through that person's "life"
  604.     routine.
  605. 82. PlayerTo(...) used only to work for moving a player to a room, but now
  606.     it can also move a player to something in a room (like a chair).
  607. 83. Message for "putting something on a non-supporter" mended.
  608. 84. The "In the ... you can see ..." message (printed when you're also in
  609.     the whatever) is now In or On as appropriate for containers/supporters.
  610. 85. "pick up", "look into" and "lie in/on" added to the grammar.
  611.  
  612. Changes in Release 5/10  (950525)
  613. =================================
  614.  
  615. 86. "notify off" no longer perversely replies "Score notification on."
  616. 87. Bug in "objects"/"places" when the player's in transformed form, fixed.
  617. 88. The parser is now capable of making an inference and then asking a
  618.     clarifying question, in the same turn: e.g. "unlock" is expanded by
  619.     the parser into "unlock chest"; "with" is further assumed; then it asks
  620.     "What do you want to unlock the chest with?" and understands the answer.
  621.     Likewise it can now infer two successive prepositions, e.g. "next to".
  622. 89. PlayerTo(1) (moving the player without a subsequent Look) now calls
  623.     NewRoom, sorts out floating objects and so forth, as it should.
  624. 90. An additive property (one for which inheritance from classes piles up
  625.     a list of values) can now contain a list in which some items are strings
  626.     and others routines.  Should this occur, then on a PrintOrRun the
  627.     the entries are executed in sequence - run if routines, printed if
  628.     strings.  A printed string in such a list always has a new-line printed
  629.     after it; and it never stops the process of execution.  In other words,
  630.     the string "Hello" is equivalent to the routine [; print "Hello^"; ],
  631.     (which returns false), not to the routine [; "Hello"; ], (which would
  632.     return true and stop execution).
  633.     This will seldom be useful but protects the Z-machine stack against
  634.     certain misfortunes on some machines.
  635. 91. The parser once again copes with "put all except the key in the bag".
  636. 92. "objects" now tells of "(worn)" objects.  (A bug used to prevent this.)
  637. 93. Returning 3 from a "before" routine of a vehicle which the player's
  638.     trying to move inside, says "do nothing, I have moved the player".
  639.     (Merely returning 2 for "do nothing" may result in the old location
  640.     being restored.)
  641. 94. A subtle bug to do with low strings having mysteriously not-quite-right
  642.     contents has now been fixed: it was due to a library mistake which
  643.     Inform 5.4 was unable to detect, but which 5.5 spotted as an error.
  644. 95. Small bug in timer/daemon listing debug verb fixed.
  645. 96. PlayerTo(somewhere,2) will |Look| as if the player had arrived in the
  646.     room by walking in as usual (so only a short description appears if
  647.     the room is one that has been seen before).
  648. 97. The parser's "take all" rules work slightly better for actors other
  649.     than the player, and when the actor is inside something.
  650.  
  651. Changes in Release 5/11  (950619)
  652. =================================
  653.  
  654. 98. *** You have died *** style messages are now in bold-face, except in
  655.     V3 games.
  656. 99. It's now legal to put things into, or take things out of, containers
  657.     that happen to be worn.  I noticed this was illegal when players of
  658.     Curses complained about the rucksack; and couldn't think of any good
  659.     reason why it should be illegal!
  660. 100. A more appropriate message is produced on attempts to push, pull or
  661.     turn animate objects.
  662. 101. If Initialise() returns 2, then no game banner is printed; thus, it
  663.     can appear later on instead, as in "Sorcerer".
  664. 102. PlayerTo() now works in the (dark room) -> (dark room) case.
  665. 103. A bug to do with message passing (which only existed under a rough
  666.     to-get-Inform-tested copy of 5/10 anyway) has been fixed.
  667. 104. A really disastrous bug to do with the parser asking supplementary
  668.     questions (causing interpreters to behave badly on some machines, e.g.
  669.     by repeatedly saying "I beg your pardon") has hopefully now been fixed,
  670.     largely thanks to detective work by Robert Stone and Matthew Russotto.
  671.     My own interpreter never showed this bad behaviour, and I was barking
  672.     up the wrong tree in attempts to find it.  I now believe it was caused
  673.     by over-writes in the multiple_object array corrupting the "length"
  674.     byte of the (immediately following) input buffer "buffer2" used by the
  675.     parser for disambiguation questions.  I have taken three different
  676.     precautions to prevent this occurring in future.
  677. 105. A bug to do with changing the player character and then entering dark
  678.     locations (when one might spookily bump into one's former self) has been
  679.     fixed.
  680. 106. "ask someone for something" is now automatically translated into
  681.     "someone, give something to me" (i.e., this ##Order is generated).
  682. 107. Multiple-object commands (such as "take all") generate a list of actions,
  683.     which all make contextual sense at the time when the command is typed.
  684.     However, a weakness of the parser is that when some of these actions have
  685.     been processed, the remaining ones may no longer make sense.  For
  686.     instance, if the player has been teleported to the planet Mars halfway
  687.     through picking up a pile of ten items.  The parser now stops the list
  688.     if the player has either (a) moved location, or (b) fallen into darkness,
  689.     as a result of earlier actions.
  690. 108. When the parser is working on a "creature" token, and the player typed
  691.     something which is ambiguous but definitely isn't animate, then no
  692.     question is now asked to resolve this ambiguity (as there's no point).
  693.     (Such a question used to read slightly oddly.)
  694. 109. print (DirectionName) x;  will now (under I5.5) print the name of the
  695.     direction whose door_dir is x.  Thus, x==n_to results in "north" being
  696.     printed.
  697. 110. The property "capacity" can now take a routine returning a value,
  698.     instead of a value.
  699. 111. "full score" is now understood as "fullscore".  ("full" always was.)
  700. ----------------------------------------------------------------------------
  701.